;(function(g){

  if (g.autoWall) return false;
  var autoWall = g.autoWall = {};

  var _returnStatusMap = {
    'again': "上墙失败，已加入重试队列中",
    'failed': "上墙失败",
    'success': "上墙成功"
  };

  // html定时器
  autoWall.htmlTaskTimer = null;
  // 上墙定时器
  autoWall.wallTaskTimer = null;
  // 通知实例
  autoWall.messenger = null;
  // 上墙延迟时间
  autoWall.wallTime = 5000;
  // 获取html的时间
  autoWall.htmlTime = 8000;
  // 单词html的消息数(默认20)
  autoWall.htmlCount = 50;
  // 是否debug
  autoWall.DEBUG = true;

  /**
   * 初始化自动上墙
   * @param  {Function} cb [description]
   * @return {[type]}      [description]
   */
  autoWall.init = function(cb)
  {
    // 获取自动上墙是否打开
    common.send({
      'func': 'getAutoWallStatus'
    }, function(ret){
      if (!ret.result) return cb(false);
      if (!ret.data)  return cb(false);
      autoWall.bind(ret);
      cb(true);
    });
  };

  /**
   * 绑定自动上墙
   */
  autoWall.bind = function(ret)
  {

    // 配置config
    if(ret && ret.config) {
      this.htmlCount = parseInt(ret.config.htmlCount)     || 20;
      this.wallTime  = parseInt(ret.config.wallTime)*1000 || 5000;
      this.htmlTime  = parseInt(ret.config.htmlTime)*1000 || 8000;
    }


    // 通知
    // 提示消息
    this.messenger = $.globalMessenger().post({
      message: "【微信大屏幕-自动上墙】正在运行中，请不要关闭此页面。",
      hideAfter: 30000,
      type: 'info'
    });

    // 抓取任务
    this.doHtmlTask();
    // 上墙任务
    this.doWallTask();
  };

  /**
   * 执行获取html的任务
   */
  autoWall.doHtmlTask = function()
  {
    var me = this;
    clearInterval(this.htmlTaskTimer);
    this.htmlTaskTimer = setInterval(function(){
      me.getMessageList(me.htmlCount, function(err, list){
        if (err) {
          if (me.DEBUG) console.log("getMessageList failed: ", err);
          return;
        }
        if (!list.length) return;
        common.send({'func':'taskAdd', 'task':list}, function(res){
          if (!res.result && me.DEBUG) console.log("taskAdd failed ", res.error_msg);
          if (res.detail) {
            me.messenger.update({
              message: "【微信大屏幕-自动上墙】已添加新任务。成功："+res.detail.completeCount+" 剩余："+res.detail.leftCount+" 失败："+res.detail.failedCount+" 智能过滤："+res.detail.forbidId.length,
              hideAfter: 30000,
              type: 'info'
            });
          }
        });
      });
    }, this.htmlTime);
  };


  /**
   * 执行上墙任务
   */
  autoWall.doWallTask = function()
  {
    var me = this;
    common.send({'func':'taskGetOne'}, function(res){
      if (!res.result) {
        me.messenger.update({
          message: "【微信大屏幕-自动上墙】获取任务失败："+res.error_msg,
          hideAfter: 30000,
          type: 'error'
        });
        return;
      }
      // 循环执行任务
      if(res.task) me.doTaskOne(res.task);
      me.wallTaskTimer = setTimeout(function(){
        me.doWallTask();
      }, me.wallTime);
    });
  };

  /**
   * 执行上墙任务单个
   */
  autoWall.doTaskOne = function(message)
  {
    var me = this;

    if(!message || !message.id || !message.fakeid) return false;

    this.getMessageDetail(message, function(err, detail){
      if (err) {
        var data = {'task':message, 'func':'taskCompleteOne', 'result':false, 'error_msg':err};
        common.send(data, function(res){
          if(res.result) {
            me.messenger.update({
              message: "【微信大屏幕-自动上墙】"+_returnStatusMap[res.returnStatus]+"："+res.detail.completeCount+" 剩余："+res.detail.leftCount+" 失败："+res.detail.failedCount+" 智能过滤："+res.detail.forbidId.length,
              hideAfter: 30000,
              type: 'error'
            });
          }
        });
        return;
      }
      // 上墙
      detail.wall_type = 1;
      detail.wall_helper = "1";
      detail.wall_auto = '1';
      detail.func = 'saveMessage';
      common.send(detail, function(res){
        if ( !res.success ) {
          var data = {'task':message, 'func':'taskCompleteOne', 'result':false, 'error_msg':res.error_msg, error_type:res.error_type};
          common.send(data, function(res){
            if(res.result) {
              if(res.error_msg) {
                me.messenger.update({
                  message: "【微信大屏幕-自动上墙-已屏蔽】["+res.error_msg+"]"+_returnStatusMap[res.returnStatus]+"："+res.detail.completeCount+" 剩余："+res.detail.leftCount+" 失败："+res.detail.failedCount+" 智能过滤："+res.detail.forbidId.length,
                  hideAfter: 30000,
                  type: 'error'
                });
              } else {
                me.messenger.update({
                  message: "【微信大屏幕-自动上墙】"+_returnStatusMap[res.returnStatus]+"："+res.detail.completeCount+" 剩余："+res.detail.leftCount+" 失败："+res.detail.failedCount+" 智能过滤："+res.detail.forbidId.length,
                  hideAfter: 30000,
                  type: 'error'
                });
              }
            }
          });
          return;
        }
        var data = {'task':message, 'func':'taskCompleteOne', 'result':true, 'error_msg':"", error_type:res.error_type};
        common.send(data, function(res){
          //...taskStatus 当前任务
          if(res.result) {
            me.messenger.update({
              message: "【微信大屏幕-自动上墙】"+_returnStatusMap[res.returnStatus]+"："+res.detail.completeCount+" 剩余："+res.detail.leftCount+" 失败："+res.detail.failedCount+" 智能过滤："+res.detail.forbidId.length,
              hideAfter: 30000,
              type: 'success'
            });
          }
        });
        return;
      });
    });
  };

  /**
   * 获取一条消息详情
   */
  autoWall.getMessageDetail = function(message, cb)
  {
    var me = this;
    var id = message && message.id || 0;
    if (!id || !cb) {
      if (cb) return cb('message is empty');
      return false;
    }

    var tasks = [], token = common.getToken();

    // 获取用户
    var userName  = message.nick_name;
    var fakeId    = message.fakeid;
    var avatarUrl = "https://mp.weixin.qq.com/misc/getheadimg?token="+token+"&fakeid="+fakeId;
    var content   = '';
    var photo     = '';
    var avatar    = '';
    var mpAddTime = common.getDate(message.date_time*1000);

    if (!fakeId) {
      cb('message.fakeid is empty');
      return false;
    }

    // 获取userInfo
    tasks.push(function(callback){
      common.getUserInfo(fakeId, callback);
    });

    tasks.push(function(callback){
      common.imageToData(avatarUrl, callback);
    });

    if (message.type == 2) {
      var photoUrl = "https://mp.weixin.qq.com/cgi-bin/getimgdata?token="+token+"&msgid="+message.id+"&mode=big&source=&fileId=0";
      tasks.push(function(callback){
        common.imageToData(photoUrl, callback);
      });
    } else {
      content = message.content;
    }

    // 并行获取
    async.parallel(tasks, function(err, data){
      if ( err ) {
        cb(err);
        return;
      }

      var userInfo = data[0] ? data[0] : null;
      if (!userInfo) {
        cb('get userInfo failed');
        return false;
      }

      avatar = data[1];
      photo  = data[2] ? data[2] : '';
      // post
      if ( !avatar || !fakeId || !userName || !(content || photo) || !id ) {
        cb('获取消息失败，无法获取到微信消息，请刷新页面重试');
        return;
      }

      cb(null, {
        'user_info' : userInfo,
        'avatar'    : avatar,
        'fakeid'    : fakeId,
        'user_name' : userName,
        'content'   : content,
        'photo'     : photo,
        'mp_message_id': id,
        'mp_add_time': mpAddTime
      });
    });
  };

  /**
   * 解析消息
   */
  autoWall.getMessageList = function(count, cb)
  {
    var me = this;
    this.getHtml(count, function(err, html){
      if (err) return cb(err);
      var matches = html.match(/\(\{\"msg_item\"\:(\[\{.*?\}\])\}\)/m);
      if(!matches || !matches[1]) return cb('match html failed');
      var jsonMathces = null;
      try{
        // JSON有些时候会出错
        jsonMathces = eval(matches[1]);
        // jsonMathces = JSON.parse(matches[1]);
      } catch(e) { }
      if (!jsonMathces) return cb('json parse error');
      // 排除掉非图片文本
      var messageList = [];
      $.each(jsonMathces, function(k, v){
        if (v.type == 1 || v.type == 2) {
          messageList.push(v);
        }
      });
      cb(null, messageList);
    });
  };

  /**
   * 获取html
   */
  autoWall.getHtml = function(count, cb)
  {
    count = count || 20;
    var token = common.getToken();
    var url = "https://mp.weixin.qq.com/cgi-bin/message?t=message/list&count="+count+"&day=7&token="+token+"&lang=zh_CN";
    $.ajax({
      type:"GET",
      beforeSend: function (request){
        request.setRequestHeader('X-Requested-With', {toString: function(){ return ''; }});
      },
      url: url,
      //data: msg,
      //dataType: 'json',
      success: function(html) {
        if (cb) cb(null, html);
      },
      error: function(xhr, errTxt, errThrown){
        if (cb) cb(xhr.status+' '+errTxt);
      }
    });
  };

})(window);



/**
 * 实时消息模块
 */

function main(res){

  // 消息通知
  $._messengerDefaults = {
    extraClasses: 'messenger-fixed messenger-theme-future messenger-on-top'
  }

  // 获取当前账号名
  var wxName    = common.getWeixinName();
  common.send({
    'func': 'check_account',
    'weixin_name': wxName
  }, function(res){
    if (res.success !== true) {
      return false;
    }

    // 大屏幕-自动上墙
    autoWall.init(function(isSuccess){

      //if (isSuccess) return;

      // 绑定分页点击
      $('#listContainer')[0].addEventListener('DOMNodeInserted', function(){
        setTimeout(function(){
          insertDom();
        }, 1000);
      });

      // 插入dom
      insertDom();
      // 绑定事件
      bindEvent();

      // 插入主持人说
      presenterHandler();

      // 准备就绪
      if ( res.error && res.error == 'not_login' ) {
        common.send({
          'func': 'showNoti',
          'id': 'mp_message_ready',
          'title': '登录提示',
          'content': res.error_msg
        });
      } else {
        common.send({
          'func': 'showNoti',
          'id': 'mp_message_ready',
          'title': '温馨提示',
          'is_warmtip': 1,
          'content': '您可以点击浏览器右上角大屏幕图标查看上墙的消息~'
        });
      }

      // 检查消息上墙状态
      checkOnWall();
    });
  });
}

/**
 * 绑定事件
 */
function bindEvent()
{
  // 加星
  $('.wxs_favBtn').live('click', function(){
    if ( $(this).attr('data-disabled') == 'yes' ) {
      alert('请稍等，正在上墙中...');
      return;
    }
    $(this).attr('data-disabled', 'yes');
    // loading
    $(this).siblings('.loading').show().siblings().hide();

    var liDom     = $(this).closest('.message_item');
    var messageId = liDom.attr('data-id');
    // 获取是否是插播
    var wallType  = 1;

    var that = $(this);
    getMsgById(messageId, function(err, msg){
      if (err) {
        alert(err);
        return;
      }
      msg.wall_type = wallType;
      msg.is_tag    = 1;
      msg.func = 'saveMessage';
      common.send(msg, function(res){
        that.attr('data-disabled', 'no');
        if ( !res.success ) {
          alert(res.error_msg);
          return;
        }
        var is_taged = res.json && res.json.is_taged == 1 ? true : false;
        that.closest('.wxs_btnBox').html(getOnWallHtml(is_taged));
      });
    });
  });

  // 插播、上墙
  // -------------------------------------------
  $('.wxs_upWallBtn, .wxs_upWallNowBtn').live('click', function(){

    if ( $(this).attr('data-disabled') == 'yes' ) {
      alert('请稍等，正在上墙中...');
      return;
    }
    $(this).attr('data-disabled', 'yes');
    // loading
    $(this).siblings('.loading').show().siblings().hide();

    var liDom     = $(this).closest('.message_item');
    var messageId = liDom.attr('data-id');
    // 获取是否是插播
    var wallType  = $(this).data('wall_type');

    var that = $(this);
    getMsgById(messageId, function(err, msg){
      if (err) {
        alert(err);
        return;
      }
      msg.wall_type = wallType;
      msg.func = 'saveMessage';
      
      common.send(msg, function(res){
        that.attr('data-disabled', 'no');
        if ( !res.success ) {
          alert(res.error_msg);
          return;
        }
        var is_taged = res.json && res.json.is_taged == 1 ? 1 : 0;
        that.closest('.wxs_btnBox').html(getOnWallHtml(is_taged));
      });
    });
  });



  // 下墙
  // -------------------------------------------
  $('.wxs_offWallBtn').live('click', function(){
    if ($(this).attr('data-disabled') == 'yes') {
      alert('请稍等...');
      return;
    }
    var me = $(this);
    var liDom = $(this).closest('.message_item');
    var mpId = liDom.attr('data-id');
    if (!mpId) {
      alert('未找到对应的微信消息');
      return;
    }

    //me.hide().siblings('.loading').show();
    $(this).attr('data-disabled', 'yes');
    common.send({
      'func': 'offWall',
      'mp_message_id': mpId
    }, function(res){
      me.attr('data-disabled', 'no');
      if ( !res.success ) {
        alert(res.error_msg);
      } else {
        //alert('下墙成功');
        // 渲染已经上墙
        me.closest('.wxs_btnBox').remove();
        var is_taged = res.json && res.json.is_taged == 1 ? 1 : 0;
        liDom.children('.message_opr').css('display', 'block').after(getInsertHtml(is_taged));
      }
    });
  });

  // 全选
  // -------------------------------------------
  $('.wxs_selectAll').click(function(){
    if ($(this).attr('checked')) {
      $('.wxs_msgCheckbox').attr('checked', 'checked');
    } else {
      $('.wxs_msgCheckbox').attr('checked', false);
    }
  });

  // 批量下墙
  $('.wxs_offAllBtn').click(function(){
    var thisBtn = $(this);
    if (thisBtn.attr('data-disabled') == 'yes') {
      alert('请稍等，正在批量下墙消息...');
      return;
    }

    var checkedIds = getCheckedIds();
    if (!checkedIds.length) {
      alert('对不起，请选择要下墙的消息');
      return;
    }

    if (!confirm('确定要批量下墙这些消息？')) {
      return false;
    }

    //me.hide().siblings('.loading').show();
    thisBtn.attr('data-disabled', 'yes');
    common.send({
      'func': 'offWall',
      'mp_message_ids': checkedIds
    }, function(res){
      thisBtn.attr('data-disabled', 'no');
      if ( !res.success ) {
        alert(res.error_msg);
      } else {
        alert('批量下墙成功');
        // 渲染已经上墙
        $.each(res.json.success_ids, function(k, v){
          var liDom = $('.message_item[data-id="'+v+'"]');
          // continue;
          if (!liDom.length) return true;
          liDom.find('.wxs_btnBox').remove();
          liDom.children('.message_opr').css('display', 'block').after(getInsertHtml());
        });
      }
    });

  });

  // 批量上墙
  $('.wxs_upAllBtn').click(function(){

    var thisBtn = $(this);
    if (thisBtn.attr('data-disabled') == 'yes') {
      alert('请稍等，正在批量上墙消息...');
      return;
    }

    var checkedIds = getCheckedIds();
    if (!checkedIds.length) {
      alert('您没有选中上墙的消息');
      return;
    }

    thisBtn.attr('data-disabled', 'yes');

    var successNum = 0, errNum = 0, totalNum = checkedIds.length;

    // 提示消息
    var messenger = $.globalMessenger().post({
      message: '正在批量上墙消息...，成功：'+successNum+'，失败：'+errNum+'，总数：'+totalNum,
      hideAfter: 300,
      type: 'info'
    });

    for(var i = 0; i < checkedIds.length; i++) {

      if ($('.message_item[data-id="'+checkedIds[i]+'"]').find('.wxs_btnBox .btn-on-wall').length) {
        successNum ++;
        totalNum --;
        messenger.update({
          message: '正在批量上墙消息...，成功：'+successNum+'，失败：'+errNum+'，剩余：'+totalNum,
          hideAfter: 300,
          type: 'success'
        });
        if (totalNum <= 0) {
          messenger.update({
            message: '消息上墙队列处理完毕。成功：'+successNum+'，失败：'+errNum,
            hideAfter: 300,
            type: 'success'
          });
          setTimeout(function(){
            messenger.hide();
          }, 4000);
          thisBtn.attr('data-disabled', 'no');
          return;
        }
        continue;
      }

      getMsgById(checkedIds[i], function(err, msg){
        if(err) {
          errNum ++;
          totalNum --;
          messenger.update({
            message: '正在批量上墙消息...，成功：'+successNum+'，失败：'+errNum+'，剩余：'+totalNum,
            hideAfter: 300,
            type: 'error'
          });
          if (totalNum <= 0) {
            messenger.update({
              message: '消息上墙队列处理完毕。成功：'+successNum+'，失败：'+errNum,
              hideAfter: 300,
              type: 'success'
            });
            setTimeout(function(){
              messenger.hide();
            }, 4000);
            thisBtn.attr('data-disabled', 'no');
          }
          return;
        }
        // 上墙
        msg.wall_type = 1;
        msg.wall_helper = 1;
        msg.func = 'saveMessage';
        common.send(msg, function(res){
          if ( !res.success ) {
            errNum ++;
            totalNum --;
            messenger.update({
              message: '正在批量上墙消息...，成功：'+successNum+'，失败：'+errNum+'，剩余：'+totalNum,
              hideAfter: 300,
              type: 'error'
            });
          } else {
            // 更改上墙状态
            var liDom = $('.message_item[data-id="'+msg.mp_message_id+'"]');
            liDom.find('.wxs_btnBox').html(getOnWallHtml());
            successNum ++;
            totalNum --;
            messenger.update({
              message: '正在批量上墙消息...，成功：'+successNum+'，失败：'+errNum+'，剩余：'+totalNum,
              hideAfter: 300,
              type: 'success'
            });
          }
          if (totalNum <= 0) {
            messenger.update({
              message: '消息上墙队列处理完毕。成功：'+successNum+'，失败：'+errNum,
              hideAfter: 300,
              type: 'success'
            });
            thisBtn.attr('data-disabled', 'no');
            setTimeout(function(){
              messenger.hide();
            }, 4000);
          }
        });
      });
    }
  });
}

/**
 * 获取选中的消息ids
 */
function getCheckedIds()
{
  var ids = [], id;
  $.each($('.wxs_msgCheckbox:checked'), function(){
    id = $(this).closest('.message_item').attr('data-id');
    ids.push(id);
  });
  return ids;
}

/**
 * 通过mpId获取到消息信息
 */
function getMsgById(id, cb)
{
  if (!id || !cb) return false;

  var liDom = $('li.message_item[data-id="'+id+'"]');
  if (!liDom.length) return false;

  var tasks = [];

  // 获取用户
  // v8 对emoji名字的支持2013-12-18
  var userName  = liDom.find('.user_info .remark_name').html().trim();
  var fakeId    = liDom.find('.user_info .remark_name').attr('data-fakeid');
  var avatarUrl = liDom.find('.user_info .avatar').children('img').attr('src');
  var content   = '';
  var photo     = '';
  var avatar    = '';
  var mpAddTime = parseTimeStr(liDom.find('.message_time').text().trim());

  if (!fakeId) {
    alert('抱歉，未获取到用户名称，请将此信息记录并联系大屏幕客服');
    return false;
  }

  // 获取userInfo
  tasks.push(function(callback){
    common.getUserInfo(fakeId, callback);
  });

  tasks.push(function(callback){
    common.imageToData(avatarUrl, callback);
  });

  // 获取消息
  //var photoBox = liDom.find('.wxMsg .wxmImg');
  // liw modified: 2014-10-22
  var photoBox = liDom.find('.wxMsg .simple_img');
  if ( photoBox.length ) {
    //var photoUrl = photoBox.closest('a').attr('href');
    // liw modified: 2014-10-22
    var photoUrl = photoBox.find('.title_wrp').attr('href');
    tasks.push(function(callback){
      common.imageToData(photoUrl, callback);
    });
  } else {
    content = liDom.find('.wxMsg').html();
  }

  // 并行获取
  async.parallel(tasks, function(err, data){
    if ( err ) {
      cb(err);
      return;
    }

    var userInfo = data[0] ? data[0] : null;
    if (!userInfo) {
      cb('抱歉，未获取到用户，请将此信息记录下来并联系大屏幕客服');
      return false;
    }

    // fix userName 2014-01-16
    if(!userName && userInfo['contact_info'] && userInfo['contact_info']['nick_name']) {
      userName = userInfo['contact_info']['nick_name'];
    }

    avatar = data[1];
    photo  = data[2] ? data[2] : '';
    // post
    if ( !avatar || !fakeId || !userName || !(content || photo) || !id ) {
      cb('获取消息失败，无法获取到微信消息，请刷新页面重试');
      return;
    }
    cb(null, {
      'user_info' : userInfo,
      'avatar'    : avatar,
      'fakeid'    : fakeId,
      'user_name' : userName,
      'content'   : content,
      'photo'     : photo,
      'mp_message_id': id,
      'mp_add_time': mpAddTime
    });
  });
}

/**
 * 检查消息是否下墙
 */
function checkOnWall()
{
  // 插入单个操作
  var mpIds = [], tmpId;
  $.each($('#listContainer li'), function(){
    if ($(this).find('.mediaBox').length == 0 ) {
      tmpId =  $(this).attr('data-id');
      mpIds.push(parseInt(tmpId));
    }
  });

  // 检查上墙状态
  if (mpIds.length) {
    common.send({
      'func': 'checkOnWall',
      'mp_message_ids': mpIds
    }, function(res){
      if ( !res.success ) {
        //alert(res.error_msg);
      } else {

        // 获取被禁止的id
        common.send({'func':'taskStatus'}, function(taskRet){
          var forbidIds = taskRet && taskRet.detail ? taskRet.detail.forbidId : [];
          // 渲染已经上墙
          var ret       = res.result || [];
          var taged_arr = res.is_taged || [];
          for (var i = 0; i < mpIds.length; i++) {
            var is_taged  = taged_arr.indexOf(mpIds[i]) > -1 ? true : false;
            var li = $('#listContainer li[data-id="'+mpIds[i]+'"]');
            // 正在操作的不更改
            if(li.find('.wxs_btnBox').children('a[data-disabled="yes"]').length) {
              if(li.find('.wxs_btnBox').children('.wxs_favBtn[data-disabled="yes"]').length) {
                continue;
              }
              if(is_taged) {
                li.find('.wxs_btnBox').find('.wxs_favBtn').addClass('taged').text('取消加星');
              } else {
                li.find('.wxs_btnBox').find('.wxs_favBtn').removeClass('taged').text('加星');
              }
              continue;
            }
            if (ret.indexOf(mpIds[i]) > -1) {
              // 已上墙
              li.find('.wxs_btnBox').html(getOnWallHtml(is_taged));
            } else {
              // 未上墙
              li.find('.wxs_btnBox').remove();
              li.children('.message_opr').css('display', 'block').after(getInsertHtml(is_taged));
              // 显示阻止上墙的
              if (forbidIds.indexOf(mpIds[i]) != -1) {
                li.find('.wxs_forbidTip').show();
              }
            }
          }
        });
      }
      setTimeout(function(){
        checkOnWall();
      }, 6000);
    });
  }
}

/**
 * 注入页面按钮
 */
function insertDom()
{
  // 插入批量操作dom
  if (!$('.wxs_optsBox').length) {
    var opts = '\
      <div class="sub_title_bar white" style="line-height:20px;">\
        <div class="opts-box wxs_optsBox" style="float: none;width: 240px;margin-left: 0;">\
          <label><input type="checkbox" class="wxs_selectAll" checked="checked">全选</label>\
          <a class="wxs_upAllBtn">批量上墙</a>\
          <a class="wxs_offAllBtn">批量下墙</a>\
        </div>\
      </div>';
    /*var obj = $('.listTitle').prev('.sender_line');
    if (obj.children('h3').length) {
      obj.children('h3').remove();
    }
    obj.prepend(opts);*/

    $('.sub_title_bar').eq(0).after(opts);
  }

  var loadingDom = '\
    <div class="btn-part wxs_btnBox">\
      <span class="loading"><img src="'+chrome.extension.getURL('/images/loading.gif')+'"></span>\
    </div>';

  // 插入单个操作
  var mpIds = [], tmpId;
  $.each($('#listContainer li.message_item'), function(){
    if ( $(this).children('.wxs_btnBox').length == 0 && $(this).find('.mediaBox').length == 0 ) {
      // 获取消息ids
      var li = $(this);
      li.children('.message_opr').css('display', 'block').after(loadingDom);
      tmpId =  li.attr('data-id');
      mpIds.push(tmpId);

      if(!li.children('.wxs_msgCheckbox').length) {
        // 插入选择框
        li.prepend('<input type="checkbox" class="checkbox-message wxs_msgCheckbox" checked="checked" />');
      }
    }
  });

  // 检查上墙状态
  /*if (mpIds.length) {
    common.send({
      'func': 'checkOnWall',
      'mp_message_ids': mpIds
    }, function(res){
      if ( !res.success ) {
        alert(res.error_msg);
      } else {
        // 渲染已经上墙
        var ret = res.result;
        if (!ret || !ret.length) return;
        for (var i = 0; i < ret.length; i++) {
          var li = $('#listContainer li[data-id="'+ret[i]+'"]');
          li.find('.wxs_btnBox').html(getOnWallHtml());
        }
      }
    });
  }*/
}

/**
 * 获取insertHtml
 */
function getInsertHtml(is_taged)
{
  var tagName  = is_taged ? "取消加星" : "加星";
  var tagClass = is_taged ? "taged" : "";
  return '\
  <div class="btn-part wxs_btnBox">\
    <a data-wall_type="1" href="javascript:void(0);" class="btn-add wxs_upWallBtn">上墙</a>\
    <a data-wall_type="2" href="javascript:void(0);" class="btn-add wxs_upWallNowBtn">插播</a>\
    <a href="javascript:void(0);" class="btn-add '+tagClass+' wxs_favBtn">'+tagName+'</a>\
    <a title="此消息已被敏感词库智能过滤，您可以选择手动上墙" class="btn-tip-error wxs_forbidTip" style="display:none;">已被自动上墙过滤</a>\
    <span class="loading" style="display:none;"><img src="'+chrome.extension.getURL('/images/loading.gif')+'"></span>\
  </div>';
}

/**
 * 获取已经上墙的dom
 */
function getOnWallHtml(is_taged)
{
  var tagName  = is_taged ? "取消加星" : "加星";
  var tagClass = is_taged ? "taged" : "";
  return '\
    <a data-wall_type="1" href="javascript:void(0);" class="btn-on-wall">已上墙</a>\
    <a data-wall_type="2" href="javascript:void(0);" class="btn-del wxs_offWallBtn">下墙</a>\
    <a href="javascript:void(0);" class="btn-add '+tagClass+' wxs_favBtn">'+tagName+'</a>\
    <a title="此消息已被敏感词库智能过滤，您可以选择手动上墙" class="btn-tip-error wxs_forbidTip" style="display:none;">已被自动上墙过滤</a>\
    <span class="loading" style="display:none;"><img src="'+chrome.extension.getURL('/images/loading.gif')+'"></span>\
  ';
}

/**
 * 获取主持人说的html
 */
function presenterHandler()
{
  // 插入dom
  presenterInsertHtml();

  common.send({'func': 'getPresenterInfo'}, function(res){
    if(res.info == 'ok') {
      // 更新头像和名字
      presenterUpdate(res);
      // 绑定事件
      presenterBindEvent();
    }
  });
}

function presenterInsertHtml()
{
  if($('#presenterShowPopBtn').length) {
    return false;
  }
  // 插入页面dom
  var html = '\
    <!--主持人-->\
    <div class="host-pop">\
      <p class="host-tit"><em>主持人</em></p>\
      <span class="host-photo-wrap"><img src="'+chrome.extension.getURL('/images/host_photo.jpg')+'" alt=""></span>\
      <a href="###" class="btn-host-add" id="presenterShowPopBtn">添加内容</a>\
    </div>\
    <div class="host-addcont" style="display:none;" id="presenterPop">\
      <div class="pop-hosttop clearfix">\
        <a href="###" class="host-close" id="presenterCloseBtn">×</a>\
        <span class="add-hosttit">主持人说</span>\
      </div>\
      <div class="host-center">\
        <div class="host-info">\
          <a href="###" class="left"><img id="presenterAvatar" src="" width="50" alt=""></a>\
          <div class="host-info-txt">\
            <p class="host-fill">\
              <span class="host-fillname" id="presenterNameBox"></span>\
              <input type="text" id="presenterNewName" style="display:none;">\
              <a href="###" class="host-edit" style="background: url('+chrome.extension.getURL('/images/icon_edit.png')+') 5px center no-repeat;" id="presenterNameEditBtn">修改姓名</a>\
            </p>\
            <p class="btn-file">\
              <input type="file" id="presenterNewAvatar">\
              <a href="###" class="btn-change-photo">点击更换头像</a>\
            </p>\
          </div>\
          <p class="wrap-txtarea">\
            发布消息：\
            <textarea id="presenterMessageContent" placeholder="输入文字内容"></textarea>\
          </p>\
          <p class="wrap-hostbtn">\
            <button class="host-submit" id="presenterSendBtn">发布</button>\
          </p>\
          <p class="wrap-txtarea">\
            发布图片：<input type="file" accept="image/*" id="presenterImageIpt"> \
            <button class="host-submit" id="presenterSendImageBtn" style="float: right;">发布</button> \
          </p> \
          <p id="presenterImagePreviewBox" class="wrap-txtarea" style="margin-top: 5px;border:none;"></p> \
        </div>\
      </div>\
    </div>\
    <!--end 主持人-->';

  $('body').append(html);
  return true;
}

function presenterUpdate(info)
{
  if(!info)       return false;

  if(info.name){
    $('#presenterNameBox').text(info.name);
  } else {
    $('#presenterNameBox').text(common.getWeixinName());
  }
  if(info.avatar) {
    $('#presenterAvatar').attr('src', info.avatar);
  } else {
    // 获取base64
    common.getHeadImg(function(err, data){
      if(!err) {
        $('#presenterAvatar').attr('src', data);
      } else {
        if(common.DEBUG) console.log("getHeadImg failed", err);
      }
    });
  }
  return true;
}

function presenterBindEvent()
{
  // 显示pop
  $('#presenterShowPopBtn').click(function(){
    $('#presenterPop').show();
  });

  // 关闭pop
  $('#presenterCloseBtn').click(function(){
    $('#presenterPop').hide();
  });

  // 更改名字
  $('#presenterNameEditBtn').click(function(){
    var thisBtn = $(this);
    if(thisBtn.attr('data-disabled') == 'yes') {
      alert("请稍等，正在保存...");
      return false;
    }

    $('#presenterSendBtn').attr('data-disabled', 'yes').css({'background': '#ccc'});

    var action = thisBtn.attr('data-action') || 'edit';
    if(action == 'edit') {
      $('#presenterNameBox').hide();
      thisBtn.text("完成").attr('data-action', 'submit');
      $('#presenterNewName').show().val($('#presenterNameBox').text().trim()).focus();

    } else {
      // 完成提交
      var name = $('#presenterNewName').val().trim();
      if(!name) {
        alert("请填写主持人在大屏幕上显示的名称");
        $('#presenterNewName').focus();

        $('#presenterSendBtn').attr('data-disabled', 'no').css({'background': 'rgb(0, 153, 51)'});
        return;
      }
      $('#presenterNameBox').text(name).show();
      $('#presenterNewName').hide();
      thisBtn.text("修改姓名").attr('data-action', 'edit').attr('data-disabled', 'yes');

      var data = {
        avatar: '',
        name: name,
        message: '',
        func: 'presenter'
      };

      var fn = function(){
        // 保存数据
        common.send(data, function(res){
          //console.log(res);
          if(res.info != 'ok') {
            alert(res.info);
          } else {
            $('#presenterAvatar').attr('src', res.avatar);
            $('#presenterNameBox').text(res.name);
          }
          thisBtn.attr('data-disabled', 'no');
          $('#presenterSendBtn').attr('data-disabled', 'no').css({'background': 'rgb(0, 153, 51)'});
        });
      };

      if($('#presenterAvatar').attr('src').indexOf('data:') == 0) {
        common.getHeadImg(function(err, headData){
          if(err) {
            alert('获取头像失败'+err);
            thisBtn.attr('data-disabled', 'no');
            $('#presenterSendBtn').attr('data-disabled', 'no').css({'background': 'rgb(0, 153, 51)'});
            return false;
          }
          data.avatar = headData;
          fn();
        });
      } else {
        fn();
      }
      return true;
    }
  });

  // 更改头像
  $('#presenterNewAvatar').change(function(){
    var reader = new FileReader();
    reader.onload = function(evt){
      var avatarData = evt.currentTarget.result;
      $('#presenterAvatar').attr('src', avatarData);
      var data = {
        avatar: avatarData,
        name: '',
        message: '',
        func: 'presenter'
      };
      // 保存数据
      common.send(data, function(res){
        //console.log(res);
        if(res.info != 'ok') {
          alert(res.info);
        } else {
          $('#presenterAvatar').attr('src', res.avatar);
          //$('#presenterNameBox').text(res.name);
        }
      });
    };
    reader.readAsDataURL($('#presenterNewAvatar')[0].files[0]);
  });

  // 发布消息
  $('#presenterSendBtn, #presenterSendImageBtn').click(function(){
    var thisBtn = $(this);
    if(thisBtn.attr('data-disabled') == 'yes') {
      return false;
    }
    var message = $('#presenterMessageContent').val().trim();
    var imageData = $('#presenterImagePreviewBox img').attr('src') || '';
    if(!message && !imageData) {
      alert("请填写内容或者选择图片");
      return false;
    }
    if(imageData) message = '';

    var data = {
      name: $('#presenterNameBox').text().trim(),
      message: message,
      image: imageData,
      func: 'presenter'
    };

    var fn = function(data)
    {
      thisBtn.attr('data-disabled', 'yes').text('提交中...').css({'background': '#ccc'});
      common.send(data, function(res){
        if(res.info != 'ok') {
          alert(res.info);
        } else {
          alert("发布成功");
          $('#presenterMessageContent').val('');
          thisBtn.attr('data-disabled', 'no').text('发布').css({'background': 'rgb(0, 153, 51)'});
          $('#presenterImageIpt').val('');
          $('#presenterImagePreviewBox').html('');
        }
      });
    };

    // 发布消息的时候获取默认头像
    if($('#presenterAvatar').attr('src').indexOf('data:') == 0) {
      common.getHeadImg(function(err, headData){
        if(err) {
          alert('获取头像失败'+err);
          thisBtn.attr('data-disabled', 'no');
          return false;
        }
        data.avatar = headData;
        fn(data);
      });
    } else {
      fn(data);
    }

  });

  // 图片发布预览
  $('#presenterImageIpt').on('change', function(){
    var file = this.files[0];    //选择上传的文件
    var r = new FileReader();
    r.readAsDataURL(file);    //Base64
    $(r).load(function(){
        $('#presenterImagePreviewBox').html('<img src="'+ this.result +'" alt="" style="max-width:473px;max-height:180px;" />');
    });
  });

}

/**
 * 解析时间
 * @param {String} timeStr 各种形式：
 *                         2012年12月25日
 *                         05月15日
 *                         00:01
 *                         昨天 23:59
 *                         前天 11:38
 * @return {String} like "2013-07-07 00:00:00"
 */
function parseTimeStr(timeStr)
{
  var timeArr, time = '';
  if (!timeStr || 'string' != typeof timeStr) return time;

  // 2012年12月25日 or 05月15日
  if (timeStr.indexOf('月') != -1) {
    if (timeStr.indexOf('年') == -1) {
      timeStr = common.getTimeDetail().year + '-' + timeStr;
    }
    timeStr = timeStr.replace('年', '-').replace('月', '-').replace('日', '');
    timeArr = timeStr.split('-');
    if (timeArr && timeArr.length == 3) {
      if (timeArr[0].length == 2) timeArr[0] = '20' + timeArr[0];
      if (timeArr[1].length == 1) timeArr[1] = '0' + timeArr[1];
      if (timeArr[2].length == 1) timeArr[2] = '0' + timeArr[2];
      time = timeArr.join('-') + ' 00:00:00';
    }
  }
  // 昨天 23:59
  else if (timeStr.indexOf('昨天') != -1) {
    var d = common.getTimeDetail(-24*3600*1000);
    time = d.year + '-' + d.month + '-' + d.date + ' ' + timeStr.replace('昨天', '').trim() + ':00';
  }
  // 前天 11:38
  else if (timeStr.indexOf('前天') != -1) {
    var d = common.getTimeDetail(-2*24*3600*1000);
    time = d.year + '-' + d.month + '-' + d.date + ' ' + timeStr.replace('前天', '').trim() + ':00';
  }
  // 00:01
  else if (timeStr.indexOf(':') != -1) {
    var d = common.getTimeDetail();
    time = d.year + '-' + d.month + '-' + d.date + ' ' + timeStr + ':00';
  }

  return time;
}

/**
 * 覆盖消息传递
 */
function newMessageHandler(msg, sender, cb)
{
  if (msg && msg.func == 'offWall') {
    var liDom = $('.message_item[data-id="'+msg.mp_message_id+'"]');
    if (liDom && liDom.length) {
      // 上墙按钮
      // 渲染已经上墙
      var box = liDom.find('div.wxMsg');
      liDom.find('.wxs_btnBox').remove();
      box.after(getInsertHtml());
    }
  }
}